# -*-coding:utf-8 -*-
#!/usr/bin/env python
#function: 0-9标准字符识别——基于二值图像横纵方差
#input:字符提取结果（png图像）
#output:识别出的匹配数字

import cv2
import numpy as np
import os

#相关函数定义

#获取每行像素平均值(输入灰度图像）
def getmean(img):
    Sidelength=20 #缩放尺寸
    #缩放图像
    img=cv2.resize(img,(Sidelength,Sidelength),interpolation=cv2.INTER_CUBIC)
    #avglist列表保存每行像素平均值
    avglist=[]
    #计算每行均值，保存到avglist列表
    for i in range(Sidelength):
        avg=sum(img[i])/len(img[i])
        avglist.append(avg)
    #返回avglist平均值
    return avglist

#计算方差(输入一个序列，返回序列方差）
def getss(list):
    #计算平均值
    avg=sum(list)/len(list)
    #定义方差变量ss，初值为0
    ss=0
    #计算方差
    for l in list:
        ss+=(l-avg)*(l-avg)/len(list)   
    #返回方差
    return ss

#计算两个图片不相似度，用两图特征方差的差值来表征（输入两幅灰度图像)
def diff(img1, img2):
    mean1=getmean(img1)
    mean2=getmean(img2)
    ss1=getss(mean1)
    ss2=getss(mean2)
    return abs(ss1-ss2)

#字符识别(输入待识别字符png和匹配库路径）
def char_rec(img,libpath, detail=0):
    #读取库文件
    libchar_list = os.listdir(libpath)
    #计算待匹配图像与库文件的不相似度

    #灰度化
    img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    diffs1=[]
    diffs2=[]    
    for path in libchar_list:
        libchar = cv2.imread(libpath+'\\'+path)
        #灰度化
        libchar = cv2.cvtColor(libchar,cv2.COLOR_BGR2GRAY)       
        tmp1 = diff(img, libchar) #纵向方差
        tmp2 = diff(img.T, libchar) #横向方差
        diffs1.append(tmp1)
        diffs2.append(tmp2)
        
    #将横、纵方向不相似度归一化为相似度并打印
    similars1 = 1 - np.array(diffs1)/max(diffs1)
    similars2 = 1 - np.array(diffs2)/max(diffs2)
    similars = (similars1 + similars2)/2
    similars = similars.tolist()   

    if detail==1:    
        print('relative similarity:')

        for i in range(10):
            print(i, ': %.2f    '%similars[i], end='')
        print('M', ': %.2f    '%similars[10], end='')
    
   #计算打印最相似结果作为匹配结果   
    res=similars.index(max(similars))

        
    if detail==1:
        if res!=10:
            print('\n**result: %d\n'%res)
        else:
            print('\n**result: %s\n'%'M')
    return res
